package com.ddz.implementation;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class Renderer extends SurfaceView implements Runnable {
	GameBase game;
	Bitmap framebuffer;
	Thread renderThread = null;
	SurfaceHolder holder;
	volatile boolean running = false;

	public Renderer(GameBase _game, Bitmap _framebuffer) {
		super(_game);
		game = _game;
		framebuffer = _framebuffer;
		holder = getHolder();

	}

	public void onResume() {
		running = true;
		renderThread = new Thread(this);
		renderThread.start();

	}

	public void run() {
		Rect dstRect = new Rect();
		long startTime = System.nanoTime();
		while (running) {
			if (!holder.getSurface().isValid())
				continue;

			float deltaTime = (System.nanoTime() - startTime) / 10000000.000f;
			startTime = System.nanoTime();

			if (deltaTime > 3.15) {
				deltaTime = (float) 3.15;
			}

			GameStateManager.getInstance().getTopState().onUpdate(deltaTime);
			GameStateManager.getInstance().getTopState().onPaint(deltaTime);

			Canvas canvas = holder.lockCanvas();
			canvas.getClipBounds(dstRect);
			canvas.drawBitmap(framebuffer, null, dstRect, null);
			holder.unlockCanvasAndPost(canvas);

		}
	}

	public void onPause() {
		running = false;
		while (true) {
			try {
				renderThread.join();
				break;
			} catch (InterruptedException e) {
				// retry
			}

		}
	}
}
